4.2.2 背包问题 组合优化的问题
猛一看是有些难度的,其实不算特别难
主要看了 JS 基于贪心算法解决背包问题示例
大致明白了
部分背包问题:固定容积的背包能放入物品的总最大价值 : 按比例降序尽可能多放入物品
物品 A B C D
价格 50 220 60 60
尺寸 5 20 10 12
-----------------
比率(价格/尺寸) 10 11 6 5
1
2
3
4
5
6
7
2
3
4
5
6
7
算法分析:
function greedy(values, weights, capacity){
var returnValue = 0
var remainCapacity = capacity
var sortArray = []
values.map((cur, index) =>{
sortArray.push({
'value': values[index],
'weight': weights[index],
'ratio': values[index]/weights[index]
})
})
// 按照价值比降序排序
sortArray.sort(function(a, b){
return b.ratio - a.ratio
})
console.log(sortArray)
//[{value: 220, weight: 20, ratio: 11},
// {value: 50, weight: 5, ratio: 10},
// {value: 60, weight: 10, ratio: 6},
// {value: 60, weight: 12, ratio: 5}]
// 每次放一个,总容积都减掉一个的重量,计算总价值
sortArray.map((cur,index) => {
var num = parseInt(remainCapacity/cur.weight); // 计算每个物品可以放几个
console.log(num)
remainCapacity -= num*cur.weight; // 放一个,剩余容积 = 总容积- 已放物品的
returnValue += num*cur.value; // 计算总价值
})
return returnValue
}
var items = ['A','B','C','D']
var values = [50,220,60,60]
var weights = [5,20,10,12]
var capacity = 32 //背包容积
greedy(values, weights, capacity) // 320
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38